package com.curricula.curriculum.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.curriculum.vo.DireccionVO;

/**
 * Clase para la el acceso a datos querys: insert, update, select y delete.
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class DireccionDAO {
	static Logger log = Logger.getLogger(DireccionDAO.class);
	
	/**
	 * Ejecucion del query con la sentencia INSERT invocada por el servicio DireccionService
	 * 
	 * @author Hugo
	 * @param AficionVO aficionVO
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean insert(DireccionVO direccionVO, Connection conn)throws SQLException{
		boolean insertado = false;
		int i=1;
		PreparedStatement ps=null;
		String sql = "INSERT INTO direccion (usr_id,dir_calle,dir_numero,dir_interior,dir_colonia,dir_cp,dir_ciudad,dir_pais, dir_orden, dir_visible)"
					+ "VALUES (?,?,?,?,?,?,?,?,?,?)";
		int rows;
		try{
			ps = conn.prepareStatement(sql);
			ps.setString(i++, String.valueOf(direccionVO.getIdUser()));
			ps.setString(i++, direccionVO.getCalle());
			ps.setString(i++, direccionVO.getNumero());
			ps.setString(i++, direccionVO.getInterior());
			ps.setString(i++, direccionVO.getColonia());
			ps.setString(i++, String.valueOf(direccionVO.getCp()));
			ps.setString(i++, direccionVO.getCiudad());
			ps.setString(i++, direccionVO.getPais());
			ps.setString(i++, String.valueOf(direccionVO.getOrden()));
			ps.setBoolean(i++, true);
			
			log.info("Consulta SQL: "+ sql);
			rows = ps.executeUpdate();
			
			
			if(rows>0){
				log.info("Insertados "+ rows+ " direcciones correctamente");
				insertado = true;				
			}else{
				log.error("No se insertaron las direcciones");
			}			
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return insertado;		
	}
	
	/**
	 * Ejecucion del query con la sentencia DELETE invocada por el servicio DireccionService
	 * se le pasa como parametro dos enteros el id del registro a eliminar y el id
	 * del usuario del cual se quiere eliminar el registro.
	 * 
	 * @author Hugo
	 * @param int idAficion
	 * @param int idUser
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean delete(int idDireccion, int idUser, Connection conn)throws SQLException{
		boolean eliminado=false;
		PreparedStatement ps = null;
		int rows;
		String sql = "DELETE FROM direccion WHERE usr_id =" + idUser + " AND dir_id=" + idDireccion;
		log.info("Consulta delete: "+ sql);
		try {
			ps = conn.prepareStatement(sql);			
			rows = ps.executeUpdate();			
			
			if(rows > 0){
				log.info("Eliminados "+ rows + "registros");
				eliminado=true;
			}
			else
				log.error("No se pudieron eliminar los registros");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}			
		}
		return eliminado;
	}
	
	/**
	 * Ejecucion del query con la sentencia UPDATE invocada por el servicio DireccionService
	 * se invoca con un parametro valor que tiene el nuevo VO a actualizar y un filtro
	 * que es el que cumplira la clausula de update.
	 * 
	 * @author Hugo
	 * @param AficionVO valor
	 * @param AficionVO filtro
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean update(DireccionVO valor, DireccionVO filtro,Connection conn)throws SQLException{
		boolean actualizado = false;
		StringBuffer sql = new StringBuffer();
		int rows;
		
		sql.append("UPDATE direccion SET");
		sql.append(" dir_calle ='"+valor.getCalle()+"'");
		sql.append(" , dir_numero = '"+valor.getNumero()+"'");
		sql.append(" , dir_interior ='"+valor.getInterior()+"'");
		sql.append(" , dir_colonia = '"+valor.getColonia()+"'");
		sql.append(" , dir_cp ='"+ String.valueOf(valor.getCp()+"'"));	
		sql.append(" , dir_ciudad ='"+valor.getCiudad()+"'");
		sql.append(" , dir_pais ='"+valor.getPais()+"'");
		sql.append(" , dir_orden ='"+String.valueOf(valor.getOrden()+"'"));
		if(valor.getVisible().equalsIgnoreCase(""))
			sql.append(" , dir_visible =0");
		else
			sql.append(" , dir_visible =1");
		
		sql.append(" WHERE 1=1");
		
		if(filtro.getCalle()!= null && !filtro.getCalle().equalsIgnoreCase(""))
			sql.append(" AND dir_calle ='"+valor.getCalle()+"'");
		if(filtro.getNumero()!= null && !filtro.getNumero().equalsIgnoreCase(""))
			sql.append(" AND dir_numero ='"+valor.getNumero()+"'");
		if(filtro.getInterior()!= null && !filtro.getInterior().equalsIgnoreCase(""))
			sql.append(" AND dir_interior ='"+valor.getInterior()+"'");
		if(filtro.getColonia()!= null && !filtro.getColonia().equalsIgnoreCase(""))
			sql.append(" AND dir_colonia ='"+filtro.getColonia()+"'");
		if(filtro.getCp()>0)
			sql.append(" AND dir_cp ='"+valor.getCp()+"'");
		if(filtro.getCiudad()!= null && !filtro.getCiudad().equalsIgnoreCase(""))
			sql.append(" AND dir_ciudad ='"+valor.getCiudad()+"'");
		if(filtro.getPais()!= null && !filtro.getPais().equalsIgnoreCase(""))
			sql.append(" AND dir_pais ='"+valor.getPais()+"'");
		if(filtro.getOrden()>0)
			sql.append(" AND dir_orden ="+String.valueOf(filtro.getOrden()));
		if(filtro.getIdUser()>0)
			sql.append(" AND usr_id ="+ String.valueOf(filtro.getIdUser()));
		if(filtro.getId()>0)
			sql.append(" AND dir_id ="+String.valueOf(filtro.getId()));
		
		log.info("Consulta update: "+ sql);
		
		PreparedStatement ps = null;		
		try {
			ps = conn.prepareStatement(sql.toString());			
			rows = ps.executeUpdate();			
			if(rows>0){
				log.info("Actualizados "+ rows+ "registros");
				actualizado = true;
			}
			else
				log.info("No se pudieron actualizar los registros");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return actualizado;
	}
	
	/**
	 * Ejecucion del query con la sentencia SELECT invocada por el servicio DireccionService,
	 * se invoca con un Vo que servira de filtro para obtener una lista con todos los elementos
	 * que cumplan la clausula del VO filtro.
	 * 
	 * @author Hugo
	 * @param AficionVO aficion
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static List<DireccionVO> find(DireccionVO direccion, Connection conn)throws SQLException{
		List<DireccionVO> listaDirecciones = new ArrayList<DireccionVO>();
		PreparedStatement ps = null;
		String sql ="SELECT * FROM direccion WHERE 1=1";
		
		if(direccion.getIdUser()>0)
			sql+=" AND usr_id ="+ direccion.getIdUser();
		if(direccion.getCalle()!= null && direccion.getCalle().trim().length()>0)
			 sql+=" AND dir_calle='"+ direccion.getCalle()+"'";
		if(direccion.getNumero()!= null && direccion.getNumero().trim().length()>0)
			 sql+=" AND dir_numero='"+ direccion.getNumero()+"'";
		if(direccion.getInterior()!= null && direccion.getInterior().trim().length()>0)
			 sql+=" AND dir_interior='"+ direccion.getInterior()+"'";
		if(direccion.getColonia()!= null && direccion.getColonia().trim().length()>0)
			 sql+=" AND dir_colonia='"+ direccion.getColonia()+"'";
		if(direccion.getCp()>0)
			 sql+=" AND dir_cp='"+ direccion.getCp()+"'";
		if(direccion.getCiudad()!= null && direccion.getCiudad().trim().length()>0)
			 sql+=" AND dir_ciudad='"+ direccion.getCiudad()+"'";
		if(direccion.getPais()!= null && direccion.getPais().trim().length()>0)
			 sql+=" AND dir_pais='"+ direccion.getPais()+"'";
		if(direccion.getVisible()!= null && direccion.getVisible().trim().length()>0)
			 sql+=" AND dir_visible=" + true;
		if(direccion.getId()>0)
			 sql+=" AND dir_id="+ direccion.getId();
		sql+=" ORDER BY dir_orden";
		
		log.info("Consulta Find: "+ sql);
		
		try {
			ps = conn.prepareStatement(sql);			
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()){
				DireccionVO encontrado = new DireccionVO();
				encontrado.setIdUser(rs.getInt("usr_id"));
				encontrado.setId(rs.getInt("dir_id"));
		    	encontrado.setCalle(rs.getString("dir_calle"));
		    	encontrado.setNumero(rs.getString("dir_numero"));
		    	encontrado.setInterior(rs.getString("dir_interior"));
		    	encontrado.setColonia(rs.getString("dir_colonia"));
		    	encontrado.setCp(rs.getInt("dir_cp"));
		    	encontrado.setCiudad(rs.getString("dir_ciudad"));
		    	encontrado.setPais(rs.getString("dir_pais"));
		    	encontrado.setOrden(rs.getInt("dir_orden"));
		    	encontrado.setVisible(rs.getInt("dir_visible")==1?"checked":"");
		    	listaDirecciones.add(encontrado);
			}	
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return listaDirecciones;		
	}

}
